// 迭代器模式
// 场景：你我协同开发一个任务清单应用

// 我的代码======================
// 自定义 实现可迭代接口 iterabel，约定内部必须要有一个iterator方法
const todos = { // 对象结构
    life: ['吃饭','睡觉','打游戏'],
    learn: ['','',''],
    work: ['喝茶'],
    // 对外提供一个统一的接口，对调用着而言，不用关心对象内部的结构，不用担心内部改变之后的影响
    each: function(callback) { // 只适用于当前的应用结构
        const all = [].concat(this.life,this.learn, this.work)
        for(const item of all) {
            callback(item)
        }
    },
     //实现迭代接口iterator，约定内部必须要有一个用于迭代的next()方法
    [Symbol.iterator]: function() { // 只适用于任何的数据结构
        const all = [...this.life, ...this.learn, ...this.work]
        let index = 0
        const self = this
        return {
            next: function() {
                 // 迭代结果接口IterationResult 
                const result = {
                    value: all[index], // 迭代到的数据
                    done: index >= all.length // 迭代有没有结束
                }
                index++;
                return result
            }
        }
    }
}


// 你的代码=====================
for(const item of todos.life) {
    console.log(item)
}
for(const item of todos.learn) {
    console.log(item)
}
for(const item of todos.work) {
    console.log(item)
}

//优化
todos.each(function(item) {
    console.log(item)
})